昨天我們將錯誤定義出Domain type,那麼我們可以對這些type做更進一步的處理,就是Either!
有些語言 像是 F#稱為Result,概念是差不多的,英文翻譯是二者之一,意思就是它會有兩種type,左邊或者右邊,
Either的左邊為錯誤,右邊為正確,Right is Right,很好記XD
而F#的Result則是左邊為正確,右邊為錯誤。
我們不會講到FP深奧的Monad,可以把Either想像成一個盒子,而這個盒子放進參數後,出來的結果有兩種,A or B,因為在做一些事情的時候,可能會發生錯誤!
比如說我們FindUserById,有可能Id丟錯誤的值,導致這個function拋出exception,那麼我們有可能會忘記做處理,這樣程式就Crash了QQ,如果我們這時候使用Either包裝起來,那麼編譯器會要我們強制處理Either,看是要兩邊都處理,還是只處理其中一邊都可以。
scott哥有一篇文章在講鐵道式編程
https://fsharpforfunandprofit.com/rop/
這樣的好處是,我們的結果如果是對的才會傳到下一個Either裡面去,如果某一個結果錯了,就不會繼續走下去,這樣做可以保證我們的Input至少有一點保障! 而且也方便我們做錯誤處理,因為我們不用管每一個function錯誤到底該去哪,只要給了Error type後,等到世界盡頭,在做最後的處理,有一種lean的味道XD
Decide as late as possible
https://apidocs.arrow-kt.io/arrow-core/arrow.core/-either/index.html